package com.checknull.druineage.customizable;

import java.util.*;

import static com.checknull.druineage.constant.Const.CONDITION;
import static com.checknull.druineage.constant.Const.DATA;

/**
 * 默认字段血缘作用计算器（清除中间表时需要）（继承重写方法即可自定义计算方式）
 */
public class UsedForCal {

    /**
     * 计算
     *
     * @param usedFor      当前源字段（待删除）血缘作用
     * @param childUsedFor 源字段的源字段的血缘作用
     * @return 计算后的血缘作用
     * @description 数据(外部)+数据(内部) -> 数据
     * 数据(外部)+判断(内部) -> 判断
     * 数据(外部)+数据，判断(内部) -> 数据，判断
     * 判断(外部) -> 判断
     * 数据，判断(外部)+数据(内部) -> 数据，判断
     * 数据，判断(外部)+判断(内部) -> 判断
     * 数据，判断(外部)+数据，判断(内部) -> 数据，判断
     */
    public Set<String> calculate(Set<String> usedFor, Set<String> childUsedFor) {
        if (usedFor.contains(CONDITION) && !usedFor.contains(DATA)) {
            return new HashSet<>(Collections.singletonList(CONDITION));
        } else if (!childUsedFor.contains(CONDITION)) {
            return new HashSet<>(usedFor);
        }
        return new HashSet<>(childUsedFor);
    }

    public Set<String> calculate(Set<String> usedFor, Collection<String> childUsedFor) {
        return calculate(usedFor, new HashSet<>(childUsedFor));
    }

    public Set<String> calculate(Set<String> usedFor, String... childUsedFor) {
        return calculate(usedFor, Arrays.asList(childUsedFor));
    }

}
